package cn.yx.common.core.util.date;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;

/**
 * <p>时间窗口类，判断指定的时间，日期或日期时间是否在某个时间，日期或日期时间范围内</p>
 *
 * @author Wgssmart
 */
public final class DateSpanUtil {

    private DateSpanUtil() {
    }

    /**
     * 判断指定的时间是否在开始和结束时间范围内，不包含开始和结束时间。beginTime < time < endTime
     *
     * @param time
     * @param beginTime
     * @param endTime
     * @return
     */
    public static boolean in(LocalTime time, LocalTime beginTime, LocalTime endTime) {
        return time.isAfter(beginTime) && time.isBefore(endTime);
    }

    /**
     * 判断当前时间是否在开始和结束时间范围内，不包含开始和结束时间。beginTime < 当前时间 < endTime
     *
     * @param beginTime
     * @param endTime
     * @return
     */
    public static boolean in(LocalTime beginTime, LocalTime endTime) {
        LocalTime time = LocalTime.now(ZoneId.systemDefault());
        return time.isAfter(beginTime) && time.isBefore(endTime);
    }

    /**
     * 判断指定的时间是否在开始和结束时间范围内，包含开始或结束时间。beginTime <= time <= endTime
     *
     * @param time
     * @param beginTime
     * @param endTime
     * @return
     */
    public static boolean inEqual(LocalTime time, LocalTime beginTime, LocalTime endTime) {
        return (time.isAfter(beginTime) && time.isBefore(endTime))
                || time.equals(beginTime)
                || time.equals(endTime);
    }

    /**
     * 判断当前时间是否在开始和结束时间范围内，包含开始或结束时间。beginTime <= 当前时间 <= endTime
     *
     * @param beginTime
     * @param endTime
     * @return
     */
    public static boolean inEqual(LocalTime beginTime, LocalTime endTime) {
        LocalTime time = LocalTime.now(ZoneId.systemDefault());
        return (time.isAfter(beginTime) && time.isBefore(endTime))
                || time.equals(beginTime)
                || time.equals(endTime);
    }

    /**
     * 判断指定的日期是否在开始和结束日期范围内，不包含开始和结束日期。beginDate < date < endDate
     *
     * @param date
     * @param beginDate
     * @param endDate
     * @return
     */
    public static boolean in(LocalDate date, LocalDate beginDate, LocalDate endDate) {
        return date.isAfter(beginDate) && date.isBefore(endDate);
    }

    /**
     * 判断当前日期是否在开始和结束日期范围内，不包含开始和结束日期。beginDate < 当前日期 < endDate
     *
     * @param beginDate
     * @param endDate
     * @return
     */
    public static boolean in(LocalDate beginDate, LocalDate endDate) {
        LocalDate date = LocalDate.now(ZoneId.systemDefault());
        return date.isAfter(beginDate) && date.isBefore(endDate);
    }

    /**
     * 判断指定的日期是否在开始和结束日期范围内，包含开始或结束日期。beginDate <= date <= endDate
     *
     * @param date
     * @param beginDate
     * @param endDate
     * @return
     */
    public static boolean inEqual(LocalDate date, LocalDate beginDate, LocalDate endDate) {
        return (date.isAfter(beginDate) && date.isBefore(endDate))
                || date.equals(beginDate)
                || date.equals(endDate);
    }

    /**
     * 判断当前日期是否在开始和结束日期范围内，包含开始或结束日期。beginDate <= 当前日期 <= endDate
     *
     * @param beginDate
     * @param endDate
     * @return
     */
    public static boolean inEqual(LocalDate beginDate, LocalDate endDate) {
        LocalDate date = LocalDate.now(ZoneId.systemDefault());
        return (date.isAfter(beginDate) && date.isBefore(endDate))
                || date.equals(beginDate)
                || date.equals(endDate);
    }

    /**
     * 判断指定的日期时间是否在开始和结束日期时间范围内，不包含开始和结束日期时间。beginDateTime < datetime < endDateTime
     *
     * @param datetime
     * @param beginDateTime
     * @param endDateTime
     * @return
     */
    public static boolean in(LocalDateTime datetime, LocalDateTime beginDateTime, LocalDateTime endDateTime) {
        return datetime.isAfter(beginDateTime) && datetime.isBefore(endDateTime);
    }

    /**
     * 判断当前日期时间是否在开始和结束日期时间范围内，不包含开始和结束日期时间。beginDateTime < 当前日期时间 < endDateTime
     *
     * @param beginDateTime
     * @param endDateTime
     * @return
     */
    public static boolean in(LocalDateTime beginDateTime, LocalDateTime endDateTime) {
        LocalDateTime datetime = LocalDateTime.now(ZoneId.systemDefault());
        return datetime.isAfter(beginDateTime) && datetime.isBefore(endDateTime);
    }

    /**
     * 判断指定的日期时间是否在开始和结束日期时间范围内，包含开始或结束日期时间。beginDateTime <= datetime <= endDateTime
     *
     * @param datetime
     * @param beginDateTime
     * @param endDateTime
     * @return
     */
    public static boolean inEqual(LocalDateTime datetime, LocalDateTime beginDateTime, LocalDateTime endDateTime) {
        return (datetime.isAfter(beginDateTime) && datetime.isBefore(endDateTime))
                || datetime.equals(beginDateTime)
                || datetime.equals(endDateTime);
    }

    /**
     * 判断当前日期时间是否在开始和结束日期时间范围内，包含开始或结束日期时间。beginDateTime <= 当前日期时间 <= endDateTime
     *
     * @param beginDateTime
     * @param endDateTime
     * @return
     */
    public static boolean inEqual(LocalDateTime beginDateTime, LocalDateTime endDateTime) {
        LocalDateTime dateTime = LocalDateTime.now(ZoneId.systemDefault());
        return (dateTime.isAfter(beginDateTime) && dateTime.isBefore(endDateTime))
                || dateTime.equals(beginDateTime)
                || dateTime.equals(endDateTime);
    }

}
